package ig.metrica.ui.confFlujos.formulada;

import ig.util.ejb.IGBean;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import javax.ejb.*;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

/**
 * This is the bean class for the ConFlujosFormuladosBean enterprise bean.
 * Created 16/03/2007 10:25:45 AM
 * @author jsanchez
 */
public class ConFlujosFormuladosBean implements SessionBean, ConFlujosFormuladosRemoteBusiness, ConFlujosFormuladosLocalBusiness {
    private SessionContext context;
    private Connection con=null;
    private PreparedStatement prep=null;
    private PreparedStatement prepTmp=null;
    private ResultSet result=null;
//    private boolean closeAll=true;
    // <editor-fold defaultstate="collapsed" desc="EJB infrastructure methods. Click the + sign on the left to edit the code.">
    // TODO Add code to acquire and use other enterprise resources (DataSource, JMS, enterprise bean, Web services)
    // TODO Add business methods or web service operations
    /**
     * @see javax.ejb.SessionBean#setSessionContext(javax.ejb.SessionContext)
     */
    public void setSessionContext(SessionContext aContext) {
        context = aContext;
    }
    
    /**
     * @see javax.ejb.SessionBean#ejbActivate()
     */
    public void ejbActivate() {
        
    }
    
    /**
     * @see javax.ejb.SessionBean#ejbPassivate()
     */
    public void ejbPassivate() {
        
    }
    
    /**
     * @see javax.ejb.SessionBean#ejbRemove()
     */
    public void ejbRemove() {
        
    }
    // </editor-fold>
    
    /**
     * See section 7.10.3 of the EJB 2.0 specification
     * See section 7.11.3 of the EJB 2.1 specification
     */
    public void ejbCreate() {
        // TODO implement ejbCreate if necessary, acquire resources
        // This method has access to the JNDI context so resource aquisition
        // spanning all methods can be performed here such as home interfaces
        // and data sources.
    }
    
    // Add business logic below. (Right-click in editor and choose
    // "EJB Methods > Add Business Method" or "Web Service > Add Operation")

    public void create(java.util.Collection CDTO) throws java.lang.Exception {
        con=this.getConexion("METRICADW");
        prep=con.prepareStatement("INSERT INTO CONFIGURACIONFLUJOSFORMULADOS(IDMODELO, PRODUCTO, FORMULA_CAPITAL, FORMULA_FECHA, FORMULA_INTERES_FIJO, FORMULA_INTERES_VARIABLE, ACTIVO,ID) VALUES( ?, ?, ?, ?, ?, ?, ?, ?)");
        try {
            for (Object elem : CDTO) {
                if(
                        ((ConFlujosFormuladosDTO)elem).getEstadoRegistro()!=null &&
                        ((ConFlujosFormuladosDTO)elem).getEstadoRegistro().equals(1) &&
                        !this.findByPk(((ConFlujosFormuladosDTO)elem).getIdModleo(),((ConFlujosFormuladosDTO)elem).getProducto(),((ConFlujosFormuladosDTO)elem).getId())) {
                    
                    prep.setInt(1,((ConFlujosFormuladosDTO)elem).getIdModleo());
                    prep.setString(2,((ConFlujosFormuladosDTO)elem).getProducto().trim());
                    prep.setString(3,((ConFlujosFormuladosDTO)elem).getFormulaCapital().toUpperCase());
                    prep.setString(4,((ConFlujosFormuladosDTO)elem).getFormulaFecha().toUpperCase());
                    prep.setString(5,((ConFlujosFormuladosDTO)elem).getFormulaInteresFijo().toUpperCase());
                    prep.setString(6,((ConFlujosFormuladosDTO)elem).getFormulaInteresVariable().toUpperCase());
                    prep.setInt(7,1);
                    prep.setInt(8,this.getSiguienteId());
                    
                    prep.execute();
                    
                }
            }
        } catch (Exception e) {
//            closeAll=true;
            throw e;
        }finally {
//            if(closeAll)
            this.closeAll();
        }
    }
    
    public void update(java.util.Collection CDTO) throws java.lang.Exception {
//        closeAll=false;
        con=this.getConexion("METRICADW");
        prep=con.prepareStatement("UPDATE CONFIGURACIONFLUJOSFORMULADOS SET FORMULA_CAPITAL = ?, FORMULA_FECHA = ?, ACTIVO = ?, FORMULA_INTERES_FIJO = ?, FORMULA_INTERES_VARIABLE = ? WHERE IDMODELO = ? AND PRODUCTO = ? AND ID=?");
        try {
            for (Object elem : CDTO) {
                if(((ConFlujosFormuladosDTO)elem).getEstadoRegistro()!=null && ((ConFlujosFormuladosDTO)elem).getEstadoRegistro().equals(3)
                || (
                        (((ConFlujosFormuladosDTO)elem).getFormulaCapital().trim().equals("")
                        && ((ConFlujosFormuladosDTO)elem).getFormulaFecha().trim().equals("")
                        && ((ConFlujosFormuladosDTO)elem).getFormulaInteresFijo().trim().equals("")
                        && ((ConFlujosFormuladosDTO)elem).getFormulaInteresVariable().trim().equals("")
                        ))){
                    this.delete((ConFlujosFormuladosDTO)elem);
                }else if(((ConFlujosFormuladosDTO)elem).getEstadoRegistro()!=null &&
                        ((ConFlujosFormuladosDTO)elem).getEstadoRegistro().equals(2)) {
                    prep.setString(1,((ConFlujosFormuladosDTO)elem).getFormulaCapital().toUpperCase());
                    prep.setString(2,((ConFlujosFormuladosDTO)elem).getFormulaFecha().toUpperCase());
                    prep.setInt(3,((ConFlujosFormuladosDTO)elem).getActivo());
                    prep.setString(4,((ConFlujosFormuladosDTO)elem).getFormulaInteresFijo().toUpperCase());
                    prep.setString(5,((ConFlujosFormuladosDTO)elem).getFormulaInteresVariable().toUpperCase());
                    prep.setInt(6,((ConFlujosFormuladosDTO)elem).getIdModleo());
                    prep.setString(7,((ConFlujosFormuladosDTO)elem).getProducto().trim());
                    prep.setInt(8,((ConFlujosFormuladosDTO)elem).getId());
                    prep.execute();
                }
            }
//            this.create(CDTO);
//            closeAll=true;
        } catch (Exception e) {
//            closeAll=true;
            throw e;
        }finally {
//            if(closeAll)
            this.closeAll();
        }
    }
    
    public Collection findByModelo(java.lang.Integer idModelo) throws java.lang.Exception {
        Collection CDTO=new ArrayList();
        con=this.getConexion("METRICADW");
        prep=con.prepareStatement("SELECT ID, IDMODELO, PRODUCTO, FORMULA_CAPITAL, FORMULA_FECHA,FORMULA_INTERES_FIJO, FORMULA_INTERES_VARIABLE, ACTIVO FROM CONFIGURACIONFLUJOSFORMULADOS WHERE IDMODELO = ?");
        try {
            prep.setInt(1,idModelo);
            this.result=prep.executeQuery();
            while(result.next()){
                ConFlujosFormuladosDTO dto=new ConFlujosFormuladosDTO(result.getInt("ID"),result.getString("PRODUCTO"),result.getInt("IDMODELO"),result.getInt("ACTIVO"),result.getString("FORMULA_CAPITAL"),result.getString("FORMULA_FECHA"),result.getString("FORMULA_INTERES_FIJO"),result.getString("FORMULA_INTERES_VARIABLE") );
                dto.setEstadoRegistro(0);
                CDTO.add(dto);
            }
            return CDTO;
        } catch (Exception e) {
            throw e;
        }finally {
            this.closeAll();
        }
    }
    
    private boolean findByPk(Integer idModelo,String producto,Integer id) throws Exception {
        PreparedStatement prep1=con.prepareStatement("SELECT PRODUCTO FROM CONFIGURACIONFLUJOSFORMULADOS WHERE IDMODELO = ? AND PRODUCTO = ? AND ID = ?");
        try {
            prep1.setInt(1,idModelo);
            prep1.setString(2,producto.trim());
            prep1.setInt(3,id);
            if(prep1.executeQuery().next())
                return true;
            else
                return false;
        } catch (Exception e) {
//            closeAll=true;
            throw e;
        }finally {
            try {
                prep1.close();
            } catch (Exception e) {}
//            if(closeAll)
            //this.closeAll();
        }
    }
    
    public void delete(ig.metrica.ui.confFlujos.formulada.ConFlujosFormuladosDTO DTO) throws java.lang.Exception {
        con=this.getConexion("METRICADW");
        prep=con.prepareStatement("DELETE FROM CONFIGURACIONFLUJOSFORMULADOS WHERE IDMODELO = ? AND  PRODUCTO = ? AND ID = ?");
        try {
            prep.setInt(1,DTO.getIdModleo());
            prep.setString(2,DTO.getProducto().trim());
            prep.setInt(3,DTO.getId());
            //            prep.setInt(8,((ConFlujosFormuladosDTO)elem).getId());
            prep.executeUpdate();
        } catch (Exception e) {
//            closeAll=true;
            throw e;
        }finally {
//            if(closeAll)
            this.closeAll();
        }
    }
    
    public Connection getConexion(String datasource) throws NamingException, SQLException{
        return new IGBean().getConexion(datasource);
        /*Context ctx = new InitialContext();
        DataSource ds = (DataSource)ctx.lookup("java:/"+datasource);
        return ds.getConnection();*/
    }
    
    private void closeAll(){
        try {
            con.close();
        } catch (Exception e) {}
        try {
            prep.close();
        } catch (Exception e) {}
        try {
            result.close();
        } catch (Exception e) {}
    }
    
    private Integer getSiguienteId() throws Exception{
        try {
            prepTmp=con.prepareStatement("SELECT ID FROM CONFIGURACIONFLUJOSFORMULADOS WHERE ID = ?");
            int i=1;
            while(true){
                prepTmp.setInt(1,i);
                if(!prepTmp.executeQuery().next())
                    return i;
                i++;
                prepTmp.clearParameters();
            }
        } catch (Exception e) {
            throw e;
        }finally {
            try {prepTmp.close();} catch (Exception e) {}
        }
    }    
    
}